/**
 * var 存在的一些问题
 * var a=5;
console.log(a);
// var a=5，通过声明来创建变量，方法内声明就是局部，全局内声明就是全局变量
// delete a
// console.log(a);
// console.log(window.a); //早期设计缺陷

b=6;
// 相当于属性赋值。window赋值一个b=6的属性 可以通过delete方法验证，delete方法只能删除对象的属性，不能删除变量
console.log(b);
// delete b
// console.log(b);
// console.log(window.b);

 */


/*

let  a=5;
let a=10;
console.log(a);//let定义的变量不允许重复声明
*/

/**
 *console.log(a);
var a=5;
// 预解析 var定义的变量会提升 var a   log（a） a=5
console.log(b);
let b=5;//let不存在变量提升   
 */

/**
 * 暂时性死区 {}区域内必须先声明在使用
 * 
 * （1）
 * var a=5
 * if(true){
 * a=6
 * let a;
 * }
 * （2） a=b时，b还没赋值。所以暂时性死区
 * function foo（a=b,b=2）{
 * console.log(a,b)
 * }
 * foo()
 */

// for(var i =0;i<3;i++){
//     console.log('循环内的',i);
// }
// console.log('循环外的',i);

// for(let i =0;i<3;i++){
//     console.log('循环内的',i);
// }
// console.log('循环外的',i);
        
// if(false){
//     var a=5
// }
// console.log(a);


/**
 * for(var i=0;i<3;i++){
    setTimeout(function(){
       console.log(i); 
    })
}
//输出3次3，因为 for是同步操作，定时器是异步操作，等定时器执行时，for循环已经结束，最后一次i=3，所以执行3次i=3

for(var i=0;i<3;i++){
    (function(j){
        setTimeout(function(){
            console.log(j); 
         })
    })(i)
}
// 可以通过立即执行函数 实现闭包 从而保证外部函数变量不会被释放 0 ，1，2 所以输出结果是0，1，2
// 什么是闭包：有一个外部函数，有一个内部函数，内部函数调用外部函数的变量，保证外部函数的变量不会被释放（被内部函数一直在引用）

for(let i=0;i<3;i++){
    setTimeout(function(){
       console.log(i); 
    })
}//通过let声明，输出0，1，2

 */
